package br.gov.dataprev.treinamento.ejb.service.impl;

import java.util.Date;
import java.util.Iterator;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Remove;
import javax.ejb.Stateful;

import br.gov.dataprev.treinamento.ejb.modelo.Cliente;
import br.gov.dataprev.treinamento.ejb.modelo.FormaPagamento;
import br.gov.dataprev.treinamento.ejb.modelo.ItemPedido;
import br.gov.dataprev.treinamento.ejb.modelo.Pedido;
import br.gov.dataprev.treinamento.ejb.modelo.Produto;
import br.gov.dataprev.treinamento.ejb.modelo.SituacaoPedido;
import br.gov.dataprev.treinamento.ejb.service.local.FreteService;
import br.gov.dataprev.treinamento.ejb.service.remote.CarrinhoRemote;

@Stateful(mappedName=CarrinhoRemote.EJB_NAME)
@Remote(CarrinhoRemote.class)
public class CarrinhoServiceImpl implements CarrinhoRemote {
	
	private Pedido pedido;
	
	@EJB
	private FreteService freteService;
	
	//@EJB
	//private PedidoDao pedidoDao;
	
	public CarrinhoServiceImpl() {
		pedido = new Pedido();
	}
	
	public void setCliente(Cliente cliente) {
		pedido.setCliente(cliente);
	}
	
	public Pedido getPedido() {
		return pedido;
	}

	public void setFormaPagamamento(FormaPagamento forma) {
		pedido.setFormaPagamento(forma);
	}

	public void adicionarItem(Produto produto, int quantidade) {
		
		//verifica se o produto já está no carrinho
		for (ItemPedido ip : pedido.getItens()) {
			if(ip.getProduto().equals(produto)) {
				int novaQuantidade = ip.getQuantidade()+quantidade;
				ip.setQuantidade(novaQuantidade);
				return;
			}
		}
		
		ItemPedido ip = new ItemPedido();
		ip.setProduto(produto);
		ip.setQuantidade(quantidade);
		pedido.addItem(ip);
		
	}
	
	public void removerItem(Produto produto) {
		
		Iterator<ItemPedido> iterator = pedido.getItens().iterator();
		
		while (iterator.hasNext()) {
			ItemPedido ip = iterator.next();
			if (ip.getProduto().equals(produto)) {
				iterator.remove();
				return;
			}
		}
		
	}
	
	
	@Remove
	@Override
	public Pedido finalizarPedido() {
		pedido.setSituacao(SituacaoPedido.AGUARDANDO_CONFIRMACAO_PGTO);
		pedido.setDataCadastro(new Date());
		pedido.setValorFrete(freteService.calcularFrete(pedido));
		
		//TODO persistir pedido
		//TODO processar pagamento
		//TODO notificar cliente por email
		
		return pedido;
	}

	public void validarPedido() throws Exception {
		
		if(pedido.getFormaPagamento() == null)
			throw new Exception("Informe a forma de pagamento.");
		
		if(pedido.getItens() == null || pedido.getItens().size() == 0)
			throw new Exception("O Carrinho está vazio");
		
		if(pedido.getCliente() == null)
			throw new Exception("Cliente não informado");
			
	}
	
	@Remove
	private void cancelar() {
		
	}

}
